package cn.lcsjsxy.yxc.renerics;

import cn.lcsjsxy.yxc.collections_framework.Collection.Person;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 1.关于自定义泛型类
 */
public class GenericTest1 {
    @Test
    public void test1(){
        //如果定义了泛型类，实例化没有指明类的泛型，则认为此泛型类型为Object类型
        //要求：如果大家定义了类是带泛型的，建议在实例化时要指明类的泛型
        Order order=new Order();
        order.setOrderT(123);
        order.setOrderT("ABC");

        //建议：实例化时指明类的泛型
        Order<String> order1=new Order<>("orderAA",1001,"order:AA");
        order1.setOrderT("AA:Hello!");
        System.out.println(order1.orderT);
    }

    @Test
    public void test2(){
        SubOrder subOrder=new SubOrder();
        //由于子类在继承带泛型的父类时，指明了泛型类型。则实例化子类对象时，不再需要指明泛型。
        subOrder.setOrderT(123);
        System.out.println(subOrder.orderT);

        SubOrder1<String> subOrder1=new SubOrder1<>();
        subOrder1.setOrderT("WAWAWAW");
        System.out.println(subOrder1.orderT);
    }

    @Test
    public void test3(){
        //泛型不同的引用不能相互赋值
        ArrayList<String> strList=null;
        ArrayList<Integer> inList=null;

        Person p1=null;
        Person p2=null;
        p1=p2;

//        strList=inList;
    }

    //测试方法
    @Test
    public void test4(){
        Order<String> order=new Order<>();
        Integer[]arr=new Integer[]{1,2,3,4};
        //泛型方法在调用时，指明泛型参数的类型
        List<Integer> list=order.copyFromArrayToList(arr);
        System.out.println(list);
    }
}
